home *** CD-ROM | disk | FTP | other *** search
/ CD/PC Actual 76 / DVD Actual 1 Marzo 2003.iso / Trial / TurboCAD 7.1 Pro / Data.Cab / F24362_PropModify.cpp < prev    next >
Encoding:
C/C++ Source or Header  |  2000-11-10  |  7.1 KB  |  341 lines

  1. // propmodify.cpp : implementation file
  2. //
  3.  
  4. #include "stdafx.h"
  5. #include "LTSample.h"
  6. #include "propmodify.h"
  7.  
  8. #ifdef _DEBUG
  9. #define new DEBUG_NEW
  10. #undef THIS_FILE
  11. static char THIS_FILE[] = __FILE__;
  12. #endif
  13.  
  14. #define W_EDIT    50
  15. #define H_EDIT    20
  16.  
  17. void PutVoidToVariant(VARIANT& varVal, void* pvoid)
  18. {
  19.     switch (varVal.vt)
  20.     {
  21.         case VT_I2:
  22.             varVal.iVal = *((SHORT *)pvoid);
  23.         break;
  24.         case VT_I4:
  25.             varVal.lVal = *((long *)pvoid);
  26.         break;
  27.         case VT_R4:
  28.             varVal.fltVal = *((float *)pvoid);
  29.         break;
  30.         case VT_R8:
  31.             varVal.dblVal = *((double *)pvoid);
  32.         break;    
  33.         case VT_CY:
  34.             varVal.cyVal = *((CY *)pvoid);
  35.         break;
  36.         case VT_DATE:
  37.             varVal.date = *((DATE *)pvoid);
  38.         break;
  39.         case VT_BSTR:
  40.             varVal.bstrVal = *((BSTR *)pvoid);
  41.         break;
  42.         case VT_BOOL:
  43.             varVal.boolVal = *((BOOL *)pvoid);
  44.         break;
  45.         default:
  46.             varVal.vt = VT_EMPTY;
  47.     }
  48. }
  49.  
  50. void PutVariantToVoid(void* pvoid, VARIANT& varVal)
  51. {
  52.     switch (varVal.vt)
  53.     {
  54.         case VT_I2:
  55.             *((SHORT *)pvoid) = varVal.iVal;
  56.         break;
  57.         case VT_I4:
  58.             *((long *)pvoid) = varVal.lVal;
  59.         break;
  60.         case VT_R4:
  61.             *((float *)pvoid) = varVal.fltVal;
  62.         break;
  63.         case VT_R8:
  64.             *((double *)pvoid) = varVal.dblVal;
  65.         break;    
  66.         case VT_CY:
  67.             *((CY *)pvoid) = varVal.cyVal;
  68.         break;
  69.         case VT_DATE:
  70.             *((DATE *)pvoid) = varVal.date;
  71.         break;
  72.         case VT_BSTR:
  73.             *((BSTR *)pvoid) = varVal.bstrVal;
  74.         break;
  75.         case VT_BOOL:
  76.             *((BOOL *)pvoid) = varVal.boolVal;
  77.         break;
  78.         default:
  79.             ASSERT(FALSE);
  80.     }
  81. }
  82.  
  83.  
  84. void AFXAPI DDX_Text(CDataExchange* pDX, int nIDC, VARIANT& varVal)
  85. {
  86.     switch (varVal.vt)
  87.     {
  88.         case VT_I2:
  89.             DDX_Text(pDX, nIDC, varVal.iVal);
  90.         break;
  91.         case VT_I4:
  92.             DDX_Text(pDX, nIDC, varVal.lVal);
  93.         break;
  94.         case VT_R4:
  95.             DDX_Text(pDX, nIDC, varVal.fltVal);
  96.         break;
  97.         case VT_R8:
  98.             DDX_Text(pDX, nIDC, varVal.dblVal);
  99.         break;    
  100.         case VT_CY:
  101.         {
  102.             COleCurrency cy(varVal.cyVal);
  103.             DDX_Text(pDX, nIDC, cy);
  104.             if (pDX->m_bSaveAndValidate)
  105.                 varVal.cyVal = cy;
  106.         }
  107.         break;
  108.         case VT_DATE:
  109.         {
  110.             COleDateTime date(varVal.date);
  111.             DDX_Text(pDX, nIDC, date);
  112.             if (pDX->m_bSaveAndValidate)
  113.                 varVal.date = date;
  114.         }
  115.         break;
  116.         case VT_BSTR:
  117.         {
  118.             CString cstrVal(varVal.bstrVal);
  119.             DDX_Text(pDX, nIDC, cstrVal);
  120.  
  121.             if (pDX->m_bSaveAndValidate)
  122.             {
  123.                 if (varVal.bstrVal != NULL)
  124.                     SysFreeString(varVal.bstrVal);
  125.                 varVal.bstrVal = cstrVal.AllocSysString();
  126.             }
  127.         }
  128.         break;
  129.         case VT_BOOL:
  130.         {
  131.             CString cstrText(varVal.boolVal ? "True" : "False");
  132.             
  133.             DDX_Text(pDX, nIDC, cstrText);
  134.  
  135.             if (pDX->m_bSaveAndValidate)
  136.             {
  137.                 if (cstrText.CompareNoCase("True") == 0)
  138.                     varVal.boolVal = 1;
  139.                 else
  140.                 {
  141.                     if (cstrText.CompareNoCase("False"))
  142.                         varVal.boolVal = 0;
  143.                     else
  144.                         pDX->Fail();                    
  145.                 }
  146.             }
  147.         }
  148.         break;
  149.         default:
  150.             varVal.vt = VT_EMPTY;
  151.             pDX->Fail();
  152.     }
  153. }
  154.  
  155. /////////////////////////////////////////////////////////////////////////////
  156. // CPropModify dialog
  157.  
  158.  
  159. CPropModify::CPropModify(COleVariant *pvarVal, LPCTSTR cszName, LPCTSTR cszType, CWnd* pParent /*=NULL*/)
  160.     : CDialog(CPropModify::IDD, pParent)
  161. {
  162.     m_cstrName = cszName;
  163.     m_cstrType = cszType;
  164.     ::VariantCopyInd(m_varVal, pvarVal);
  165.     m_bInitDone = FALSE;
  166.     //{{AFX_DATA_INIT(CPropModify)
  167.         // NOTE: the ClassWizard will add member initialization here
  168.     //}}AFX_DATA_INIT
  169. }
  170.  
  171. void CPropModify::DoDataExchange(CDataExchange* pDX)
  172. {
  173.     CDialog::DoDataExchange(pDX);
  174.     if (m_bInitDone)
  175.     {
  176.         int iUpper = m_arrWnd.GetUpperBound();
  177.         CEdit *pEdit = NULL;
  178.         UINT IDC_EDIT = IDC_VAL + 1;
  179.         if (m_varVal.vt & VT_ARRAY)
  180.         {
  181.             long lLBound, lUBound;
  182.             VARIANT varVal;
  183.             ::VariantInit(&varVal);
  184.  
  185.             varVal.vt = m_varVal.vt & ~VT_ARRAY;
  186.             UINT nSize = SafeArrayGetElemsize(m_varVal.parray);
  187.             void *pelem = (void *)new BYTE[nSize];
  188.  
  189.             HRESULT  hRes = SafeArrayGetLBound(m_varVal.parray, 1, &lLBound);
  190.             ASSERT(SUCCEEDED(hRes));
  191.             hRes = SafeArrayGetUBound(m_varVal.parray, 1, &lUBound);
  192.             ASSERT(SUCCEEDED(hRes));
  193.             for (long lItem = lLBound; lItem <= lUBound; lItem++)
  194.             {
  195.                 if (pDX->m_bSaveAndValidate)
  196.                 {
  197.                     DDX_Text(pDX, IDC_EDIT, varVal);
  198.                     PutVariantToVoid(pelem, varVal);
  199.                     VERIFY(SUCCEEDED(SafeArrayPutElement(m_varVal.parray, &lItem, pelem)));
  200.                 }
  201.                 else
  202.                 {
  203.                     if (SUCCEEDED(SafeArrayGetElement(m_varVal.parray, &lItem, pelem)))
  204.                     {
  205.                         PutVoidToVariant(varVal, pelem);
  206.                         DDX_Text(pDX, IDC_EDIT, varVal);
  207.                     }
  208.                 }
  209.                 
  210.                 IDC_EDIT++;
  211.             }
  212.             delete[] pelem;
  213.  
  214.         }
  215.         else
  216.         {
  217.             DDX_Text(pDX, IDC_EDIT, m_varVal);
  218.         }
  219.     }
  220. }
  221.  
  222.  
  223. BEGIN_MESSAGE_MAP(CPropModify, CDialog)
  224.     //{{AFX_MSG_MAP(CPropModify)
  225.     //}}AFX_MSG_MAP
  226. END_MESSAGE_MAP()
  227.  
  228. /////////////////////////////////////////////////////////////////////////////
  229. // CPropModify message handlers
  230.  
  231. BOOL CPropModify::OnInitDialog() 
  232. {
  233.     CDialog::OnInitDialog();
  234.     
  235.     CStatic *pWnd = (CStatic *)GetDlgItem(IDC_NAME);
  236.     if (pWnd != NULL)
  237.     {
  238.         pWnd->SetWindowText(m_cstrName);
  239.     }
  240.  
  241.     pWnd = (CStatic *)GetDlgItem(IDC_TYPE);
  242.     if (pWnd != NULL)
  243.     {
  244.         pWnd->SetWindowText(m_cstrType);
  245.     }
  246.  
  247.     CRect rect;
  248.     pWnd = (CStatic *)GetDlgItem(IDC_VAL);
  249.     pWnd->GetWindowRect(&rect);
  250.     ScreenToClient(&rect);
  251.  
  252.     CRect rectEdit;
  253.     CEdit *pEdit = NULL;
  254.  
  255.     rectEdit.top = rect.bottom + 2;
  256.     rectEdit.bottom = rectEdit.top + H_EDIT;
  257.     UINT IDC_EDIT = IDC_VAL + 1;
  258.  
  259.     if (m_varVal.vt & VT_ARRAY)
  260.     {
  261.         int dx = 0, dy = 0;
  262.         UINT nDim = SafeArrayGetDim(m_varVal.parray);
  263.         if (nDim > 1)
  264.         {
  265.             AfxMessageBox("IDS_CANNOTTPROCESSPROPERTYDATA");
  266.             return FALSE;
  267.         }
  268.  
  269.         long lLBound, lUBound;
  270.         long max_dx = 0;
  271.  
  272.         HRESULT hRes = SafeArrayGetLBound(m_varVal.parray, 1, &lLBound);
  273.         ASSERT(SUCCEEDED(hRes));
  274.         hRes = SafeArrayGetUBound(m_varVal.parray, 1, &lUBound);
  275.         ASSERT(SUCCEEDED(hRes));
  276.         rectEdit.left = rect.left;
  277.         for (long lItem = lLBound; lItem <= lUBound; lItem++)
  278.         {
  279.             pEdit = new CEdit();
  280.             rectEdit.right = rectEdit.left + W_EDIT;
  281.             pEdit->Create(WS_CHILD
  282.                           | WS_VISIBLE
  283.                           | WS_BORDER
  284.                           | ES_AUTOHSCROLL
  285.                           | ES_LEFT,
  286.                           rectEdit,
  287.                           this,
  288.                           IDC_EDIT);
  289.  
  290.             pEdit->SetFont(GetFont());
  291.             m_arrWnd.Add(pEdit);
  292.             rectEdit.left = rectEdit.right + 2;
  293.             IDC_EDIT++;
  294.         }
  295.         
  296.     }
  297.     else
  298.     {
  299.         rectEdit.left = rect.left + (rect.Width() - W_EDIT) / 2;
  300.         rectEdit.right = rectEdit.left + W_EDIT;
  301.  
  302.         pEdit = new CEdit();
  303.         pEdit->Create(WS_CHILD
  304.                       | WS_VISIBLE
  305.                       | WS_BORDER
  306.                       | ES_AUTOHSCROLL
  307.                       | ES_LEFT,
  308.                       rectEdit,
  309.                       this,
  310.                       IDC_EDIT);
  311.  
  312.         pEdit->SetFont(GetFont());
  313.  
  314.         m_arrWnd.Add(pEdit);
  315.     }            
  316.     m_bInitDone = TRUE;
  317.     UpdateData(FALSE);
  318.  
  319.     return TRUE;  // return TRUE unless you set the focus to a control
  320.                   // EXCEPTION: OCX Property Pages should return FALSE
  321. }
  322.  
  323. BOOL CPropModify::DestroyWindow() 
  324. {
  325.     int iUpper = m_arrWnd.GetUpperBound();
  326.     CEdit *pEdit = NULL;
  327.     for (int iItem = 0; iItem <= iUpper; iItem ++)
  328.     {
  329.         pEdit = (CEdit *)m_arrWnd.GetAt(iItem);
  330.         m_arrWnd.SetAt(iItem, NULL);
  331.  
  332.         if (pEdit != NULL)
  333.             delete pEdit;
  334.  
  335.         pEdit = NULL;
  336.     }
  337.  
  338.     
  339.     return CDialog::DestroyWindow();
  340. }
  341.